home *** CD-ROM | disk | FTP | other *** search
- /*********************** main module *************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #include <alloc.h>
- #include <signal.h>
- #include "t_lex.h"
- #include "t_cio.h"
- #include "bstone_m.h"
-
- static char cpr[]={"\nBuildstone Basic, Thiessenhusen '93/94\n\n"};
-
- /**** debugging on/off ****/
- static int bdebug=0;
- FILE *errlog;
- FILE *autosav;
- int break_en=1;
- int break_req=0;
- static int auto_save=1;
- static int auto_list=1;
- int listl=0;
-
- /**** signal handler ****/
- void sig_ha(int sig)
- {
- if(sig==SIGINT)
- if(break_en)
- { break_req=1; fprintf(stderr,"Break requested\n");
- signal(SIGINT,sig_ha); }
- else
- { signal(SIGINT,SIG_IGN); }
- return;
- }
-
- void sig_ig(int sig)
- {
- if(sig==SIGINT)
- { fprintf(stderr,"Break ignored\n");
- signal(SIGINT,sig_ig); }
- return;
- }
-
-
- /**** help ****/
- void help(void)
- {
- int i;
- const char *hlp[]={"Usage: bstone <options> <filename> \n",
- "Options: -?,-h This message.",
- " -d Turn debugging on.",
- " -b Disable Ctrl-C (faster)",
- " -s Disable automatic save",
- " -l Disable auto-listing"
- ""};
-
- for(i=0;*hlp[i]!=(char)0;i++)
- fprintf(stderr,"%s\n",hlp[i]);
- return;
- }
-
- /**** symbol debugging function *****/
- int symdebug(T_NODE * tnode)
- {
- int i;
- POV_OBJ *pv;
- DIM_H *dm;
- FT_LOOP *ft;
-
- putc('\n',errlog);
- #ifdef __TURBOC__
- fprintf(errlog,"NODE: %p L: %p R: %p NL: %p P: %p N: %05d\n",
- tnode,tnode->l,tnode->r,tnode->nl,tnode->p,tnode->n);
- #endif
- fprintf(errlog,"%3d, %-8.8s : ",tnode->c,tnode->s);
- if(tnode->c>0) switch(tnode->c)
- {
- case B_NUM:
- case B_VAL: fprintf(errlog,"number, %lG",*(double *)(tnode->p));
- break;
- case B_VEC: fprintf(errlog,"vector, <%lG,%lG,%lG>",
- ((double *)(tnode->p))[0],((double *)(tnode->p))[1],
- ((double *)(tnode->p))[2] );
- break;
- case B_STR: fprintf(errlog,"string, %.30s",(tnode->s)+1);
- break;
- case B_OBJ: pv=(POV_OBJ *)(tnode->p);
- if(pv->s!=(char *)NULL)
- fprintf(errlog,"OBJ, %.30s <%d>",pv->s,pv->cnt);
- else
- fprintf(errlog,"OBJ, %s <%d>","NULL",pv->cnt);
- break;
- case B_FLD: dm=(DIM_H *)(tnode->p);
- fprintf(errlog,"field %s ",(tnode->s)+2);
- fprintf(errlog,"len %ld, %d dim: ",dm->l,dm->n);
- for(i=0;i<dm->n;i++)
- fprintf(errlog,"%d ",dm->d[i]);
- break;
- case B_FOR: ft=(FT_LOOP *)(tnode->p);
- fprintf(errlog,"for %s=%lG to %lG step %lG goto %d",
- (tnode->s)+1,ft->start,ft->end,ft->step,ft->n);
- break;
- }
- fprintf(errlog,"\n");
- return(0);
- }
-
- void obj_deb(POV_OBJ *pv,int level,FILE *fep)
- {
- int i,k;
- char *s;
-
- if(pv==(POV_OBJ *)NULL) return;
-
- for(k=0;k<PSIZE;k++) if(obj_all[k]==pv) break;
- if(k==PSIZE) { fprintf(fep,"Object not found.\n"); return; }
-
- fprintf(fep,"* OBJ ");
- for(i=0;i<level;i++) putc('|',fep);
- fprintf(fep," %d.%d.%d ",k,pv->cnt,pv->c);
- if(pv->s!=(char *)NULL) fprintf(fep,"\"%.20s\" ",pv->s);
- else fprintf(fep,"NULL ");
- if(pv->tex!=(POV_OBJ *)NULL) fprintf(fep,"TEX ");
- if(pv->bound!=(POV_OBJ *)NULL) fprintf(fep,"BOUND ");
- fprintf(fep,"\n");
-
- obj_deb(pv->tex,level+1,fep);
- obj_deb(pv->bound,level+1,fep);
- if((pv->s!=(char *)NULL) && (pv->c!=0))
- for(s=pv->s;*s;s+=5)
- {
- k=get4hex(s+1);
- obj_deb(obj_all[k],level+1,fep);
- }
- return;
- }
-
-
- /* Object debugging function */
- int objdebug(T_NODE *tnode)
- {
- POV_OBJ *pv;
-
- pv=(POV_OBJ *)(tnode->p);
- fprintf(errlog,"OBJECT %s\n",tnode->s);
- obj_deb(pv,0,errlog);
- return(0);
- }
-
-
- void write_log(void)
- {
- t_symwalk(-1,symdebug);
- t_symwalk(B_OBJ,objdebug);
-
- }
-
-
- main(int argc, char *argv[])
- {
- int i,k,n;
- int id1,id2;
- char *s;
- LEX *lex;
- static char msg[]="Executing main program.";
-
- fprintf(stderr,"%s",cpr);
- errlog=stderr;
- flev=0;
- t_setfep((fp[0]=stdin),3L);
- for(i=1;i<argc;i++)
- {
- if(*argv[i]=='-') /* options */
- for(k=1;k<strlen(argv[i]);k++)
- switch(*(argv[i]+k))
- {
- case 'd': bdebug=1;
- if((errlog=fopen("bstone.log","w"))==NULL)
- t_error("Can't open error log",2);
- fprintf(stderr,"Debugging ON.\n");
- break;
- case 'b': break_en=0;
- fprintf(stderr,"Ctrl-C OFF.\n");
- break;
- case 's': auto_save=0;
- fprintf(stderr,"Auto save OFF.\n");
- break;
- case 'l': auto_list=0;
- fprintf(stderr,"Auto list OFF.\n");
- break;
- case 'h':
- case '?':
- default: help();
- t_error("",-1);
- break;
- }
- else
- {
- if(flev>0) t_error("There is only one file argument allowed!",4);
- if((fp[++flev]=fopen(argv[i],"r"))==NULL)
- { sprintf(err_msg,"Cannot open file: %s.",argv[i]);
- t_error(err_msg,2); }
- fprintf(stderr,"Loading file: %s\n",argv[i]);
- t_setfep(fp[flev],3L);
- }
- }
-
- if(break_en)
- { signal(SIGINT,sig_ha); }
- else
- { signal(SIGINT,sig_ig); }
-
- #ifdef __TURBOC__
- if(bdebug) fprintf(errlog,"\nBytes free: %ld\n",coreleft());
- #endif
-
- /* init program area */
- for(i=0;i<MAX_LINES;i++) { program[i].n=-1; program[i].s=(char *)NULL; }
- if((obj_all=(POV_OBJ **)malloc(PSIZE*sizeof(POV_OBJ *)))==(POV_OBJ **)NULL)
- t_error(msg,1);
- for(i=0;i<PSIZE;i++) obj_all[i]=(POV_OBJ *)NULL;
- clear_program();
-
- /* command line */
- for(cmdl=1,listl=0;cmdl>0;cmdl++)
- {
- if(!flev)
- {
- if(auto_list)
- {
- n=search_line(listl);
- id1=(n-3>0) ? n-3 : 0; id2=(id1+5>MAX_LINES) ? MAX_LINES : id1+5;
- for(i=id1; (i<=id2) && (program[i].n>=0); i++)
- printf("%-6d%c %s\n", program[i].n, (i==n) ? '>' : ' ',
- retransl_line(program[i].s));
- }
- printf("\nC%d> ",cmdl);
- fflush(stdin);
- }
- lex=t_lex(NULL,NO_FORCE);
- if(lex==(LEX *)NULL) { basic_error(5); continue; }
- if(break_req)
- { break_req=0;
- for(i=1;i<=flev;i++) fclose(fp[i]);
- flev=0; t_setfep((fp[0]=stdin),3L);
- continue;
- }
- switch(lex->typ)
- {
- case EOLX:
- case END: if(!flev) cmdl=-0XFF; /* finish session */
- else
- {
- fclose(fp[flev]);
- flev-=1;
- t_setfep(fp[flev],3L); /* restore file */
- }
- break;
- case EOLN: printf("\n"); break; /* empty line */
- case ZAHL: n=lex->wert.n.i; /* store line n */
- if(bdebug && flev)
- fprintf(errlog,"%4d%c",n,(cmdl+1)%20 ? ' ':'\n');
- if(!flev) listl=n;
- lex=t_lex(NULL,NO_FORCE);
- switch(lex->typ)
- {
- case EOLX:
- case EOLN:
- insert_line(n,(char *)NULL); /* delete line n */
- break;
-
- case ZAHL: /* insert line n */
- s=program[search_line(lex->wert.n.i)].s;
- if(s!=(char *)NULL) insert_line(n,s);
- break;
-
- case '#': break;
-
- default:
- t_lex(NULL,LEX_PUSH);
- s=translate_line();
- if(s!=(char *)NULL) insert_line(n,s);
- else
- { sprintf(err_msg,"Line not stored: %d %s\n",
- n,retransl_line(cline));
- basic_error(1);
- }
- break;
- }
- break;
- default: t_lex(NULL,LEX_PUSH); /* interpret line */
- s=translate_line();
- if(s!=(char *)NULL) exec_line(s);
- break;
- }
- if(!flev) fflush(stdin);
- }
-
- /* auto save */
- if(auto_save) save_program(0,MAX_LINES,"bstone.sav");
- /* debugging */
- if(bdebug) write_log();
- free(obj_all);
- #ifdef __TURBOC__
- if(bdebug) fprintf(errlog,"\nBytes free: %ld\n",coreleft());
- #endif
-
- return(0);
- }
-